const express = require("express");
const router = express.Router();
const utils = require('../../public/utils');
const UserModel = require('../../model/user-model');
const TokenModel = require('../../model/token-model');
const userUtils = require('./user-common');

/*
 *注册
 * @params:
 *  account   账号
 *  password  密码
 *  verificationCode   验证码
 */
router.post('/register', (req, res) => {
    if (!req.body.account) {
        res.send(utils.setJsonStyle('9998', '缺少账号'));
        return;
    }
    if(!utils.validPhone(req.body.account)) {
        res.send(utils.setJsonStyle('9998', '无效手机号'));
        return;
    }
    if (!req.body.password) {
        res.send(utils.setJsonStyle('9998', '缺少密码'));
        return;
    }
    if (!req.body.verificationCode) {
        res.send(utils.setJsonStyle('9998', '缺少验证码'));
        return;
    }
    utils.checkVerificationCode(req.body.account,req.body.verificationCode).then(isB => { //验证码校验
        if(isB) {
            UserModel.find({ account: req.body.account }, (err, docs) => {
                if (err) {
                    res.send(utils.setJsonStyle('9999', '系统异常'));
                    return;
                }
                if (docs.length >= 1) {
                    res.send(utils.setJsonStyle('9998', '该用户已经存在'));
                    return;
                }
                const userModel = new UserModel({
                    account: req.body.account,
                    password: req.body.password
                });
                userModel.save((err) => {
                    if (err) {
                        res.send(utils.setJsonStyle('9999', '系统异常'));
                        return;
                    }
                    res.send(utils.setJsonStyle('0', '注册成功'));
                })
            })
        }else {
            res.send(utils.setJsonStyle('9998', '验证码错误'));
        }
    })
})

/*
 *登录
 * @params:
 *  account   账号
 *  password  密码
*/
router.post('/login', (req, res, next) => {
    const userInfo = {
        account: req.body.account,
        password: req.body.password
    }
    UserModel.findOne(userInfo, (err, data) => {
        if (err) {
            res.send(utils.setJsonStyle('9999', '系统异常'));
            return;
        }
        if (data) {
            userUtils.getTokenByUserId(data._id).then(token => {   //通过用户id获取原来token
                userUtils.deleteOneToken(token).then(boolean => {   //将原来token删除
                    if(boolean) {
                        //重新生成token
                        let tokenModel = new TokenModel({
                            userId: data._id,
                        })
                        tokenModel.save((err) => {
                            if(err) {
                                res.send(utils.setJsonStyle('9998', '系统异常'));
                                return;
                            }
                            TokenModel.findOne({userId:data._id},(err,data) => {
                                if(err) {
                                    res.send(utils.setJsonStyle('9999', '系统错误'));
                                }else {
                                    res.cookie('token',encodeURIComponent(data._id));  //把token写入cookie
                                    res.send(utils.setJsonStyle('0', '登录成功',null,{token:data._id}));
                                }
                            })
                        })
                    }else {
                        res.send(utils.setJsonStyle('9998', 'token删除失败'));
                    }
                })
            })
        } else {
            res.send(utils.setJsonStyle('9999', '账号或密码错误'));
        }
    })
})

/*
*根据token，获取个人信息。
 */
router.post('/getUserInfoByToken', (req, res, next) => {
    utils.tokenValid(req,res, async() => {
        const token = req.headers.token;
        const userId =  await userUtils.getUserIdByToken(token);
        if(userId && userId !== 9999) {
            UserModel.findOne({_id:userId},{password:0,_id: 0,createTime:0,upDateTime:0},(err,data) => {
                if(err) {
                    res.send(utils.setJsonStyle('9999', '系统异常'));
                    return;
                }
                if(!data) {
                    res.send(utils.setJsonStyle('9998', '查无此用户'));
                    return;
                }
                res.send(utils.setJsonStyle('0', 'success', data));
            })
        }else {
            res.send(utils.setJsonStyle('9999', '系统异常'));
        }
    })
})

/*
* 根据 userId获取个人信息
* @params:
*   userId  用户id
* */

router.post('/getUserInfoByUserId',(req,res,next) => {
    utils.tokenValid(req,res,async() => {
        const userId = req.body.userId;
        UserModel.findOne({userId},{password:0,_id: 0},(err,data) => {
            if(err) {
                res.send(utils.setJsonStyle('9999', '系统异常'));
                return;
            }
            if(data) {
                res.send(utils.setJsonStyle('0', 'success', data));
            }else {
                res.send(utils.setJsonStyle('9998', '查无此用户'));
            }
        })
    })
})

/*获取所有用户信息
* @params:
*   userName  用户名 （非必填）
*   account  账号 （非必填）
*   pageNum  分页，当前页数
*   pageSize  分页，展示数据条数
 */
router.post('/allUserInfo', (req, res, next) => {
    utils.tokenValid(req,res,async() => {
        let pageSize = req.body.pageSize || 10;
        let pageNum = req.body.pageNum-- <= 0 ? 0 : req.body.pageNum;
        UserModel.find(
            {
                userName: {$regex:req.body.userName || ''},    //使用$regex 实现模糊查询
                account: {$regex:req.body.account || ''},
            },
        {password: 0},{limit: Number(pageSize),skip: pageSize * pageNum},(err,docs) => {
            if(err) {
                console.log(err)
                res.send(utils.setJsonStyle('9999', '系统异常'));
                return;
            }
                let list = JSON.parse(JSON.stringify(docs));
                list.forEach(item => {
                    item.createTime = utils.dateFormat(item.createTime,'YYYY-MM-DD HH:mm');
                    item.upDateTime = utils.dateFormat(item.upDateTime,'YYYY-MM-DD HH:mm');
                    item.sexText = userUtils.changeSexCodeToText(item.sexCode);
                })
            UserModel.getCount(total => {
                res.send(utils.setJsonStyle('0', 'success',{total,list}));
            });
        })
    })
})

//设置个人信息
/*
@params:：
    userId: 用户id （必填）
    userName ： 用户的昵称 （非必填）
    headUrl ：用户的头像地址  （非必填）
    sexCode: 性别code  （非必填）
    birthday: 出生年月  （非必填）
*/
router.post('/editUserInfo', (req, res, next) => {
    utils.tokenValid(req,res,async() => {
        const _id = req.body.userId;
        const data = {};
        const params = ['userName','headUrl','sexCode','birthday'];  //应许用户修改的字段
        for(let i = 0; i < params.length; i++) {
            if(req.body[params[i]]) {
                data[params[i]] = req.body[params[i]];
            }
        }
        if(utils.checkObjectId(_id)) {
            UserModel.updateOne({_id}, data, (err) => {
                if(err) {
                    console.log(err)
                    res.send(utils.setJsonStyle('9999', '系统异常'));
                    return;
                }
                res.send(utils.setJsonStyle('0', '修改成功'));
            })
        }else {
            res.send(utils.setJsonStyle('9998', '用户id格式错误'));
        }

    })
})

/*
* 用户更新密码
* @params:
*   telepone  手机号    （必须）
*   verificationCode 验证码   （必须）
*   password 密码   （必须）
* */
router.post('/resetPassword',(req,res) => {
    utils.tokenValid(req,res,async() => {
        const account = req.body.telepone;
        utils.checkVerificationCode(account,req.body.verificationCode).then(isB => {
            if(isB) {
                const password = req.body.password;
                UserModel.update({account}, {password}, (err) => {
                    if(err) {
                        console.log(err)
                        res.send(utils.setJsonStyle('9999', '系统异常'));
                        return;
                    }
                    res.send(utils.setJsonStyle('0', '修改成功'));
                })
            }else {
                res.send(utils.setJsonStyle('9998', '验证码错误'));
            }
        })
    })

})


// 退出登录
router.post('/loginOut',(req,res,next) => {
    utils.tokenValid(req,res,async() => {
        const token = req.headers.token || req.cookies.token;
        userUtils.deleteOneToken(token).then(data => {
            if(data) {
                res.send(utils.setJsonStyle('0', '退出登录'));
            }else {
                res.send(utils.setJsonStyle('9999', '系统异常'));
            }
        })
    })
})

/*
* 删除用户
* @params:
*   userId: 用户主键 （必填）
* */
router.post('/deleteById',(req,res,next) => {
    utils.tokenValid(req,res,async() => {
        let _id = req.body.userId;
        if(utils.checkObjectId(_id)) {
            UserModel.remove({_id},(err) => {
                if(err) {
                    res.send(utils.setJsonStyle('9999', '系统异常'));
                    return;
                }
                res.send(utils.setJsonStyle('0', '删除成功'));
            })
        }else {
            res.send(utils.setJsonStyle('9998', '用户id格式错误'));
        }

    })
})

/*
* 创建用户
* @params:
*   userInfo: {
*       account: '账号',（必填）
*       password: '密码'（必填）
        userName ： 用户的昵称 （非必填）
        headUrl ：用户的头像地址  （非必填）
        sexCode: 性别code  （非必填）
        birthday: 出生年月  （非必填）
*   }
*
* */
router.post('/createUserByAdmin',(req,res,next) => {
    const userInfo = req.body.userInfo;
    const {account,password} = userInfo;
    if(!account || !password) {
        res.send(utils.setJsonStyle('9998', '缺少账号或密码'));
        return;
    }
    UserModel.findOne({account},(err,data) => {
        if(err) {
            res.send(utils.setJsonStyle('9999', '系统异常'));
            return;
        }
        if(!data) {
            const user = new UserModel(userInfo);
            user.save(err=> {
                if(err) {
                    res.send(utils.setJsonStyle('9999', '系统异常'));
                    return;
                }
                res.send(utils.setJsonStyle('0', '创建成功'));
            })
        }else {
            res.send(utils.setJsonStyle('9998', '账号已注册'));
        }
    })
})


module.exports = router;